package cn.aixuxi.notebank.controller;

import cn.aixuxi.notebank.dto.CategoryOutputDTO;
import cn.aixuxi.notebank.dto.NoteInputDTO;
import cn.aixuxi.notebank.dto.NoteOutputDTO;
import cn.aixuxi.notebank.dto.TagOutputDTO;
import cn.aixuxi.notebank.entity.UserEntity;
import cn.aixuxi.notebank.service.CategoryService;
import cn.aixuxi.notebank.service.NoteService;
import cn.aixuxi.notebank.service.TagService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.redisson.api.RLock;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 类描述 笔记控制层
 *
 * @author ruozhuliufeng
 * @version 1.0
 * @date 2020/10/24 22:59
 */
@Controller
@RequestMapping("/note")
public class NoteController {

    // 引入Redisson作为分布式锁
    @Autowired
    RedissonClient redisson;
    @Autowired
    TagService tagService;
    @Autowired
    CategoryService categoryService;
    @Autowired
    NoteService noteService;
    /**
     * 功能描述: 保存笔记
     * @param noteInputDTO 笔记信息
     * @return : 返回主页
     * @author : ruozhuliufeng
     * @date : 2020/10/25 1:01
     */
    @PostMapping("/save")
    @RequiresPermissions("note:add")
    public String save(NoteInputDTO noteInputDTO,HttpSession session){
        UserEntity user = (UserEntity) session.getAttribute("user");
        noteInputDTO.setUserId(user.getId());
        noteInputDTO.setUsername(user.getUsername());
        noteInputDTO.setEyes(1);
        noteService.save(noteInputDTO);
        return "redirect:/index";
    }

    /**
     * 功能描述: 根据id获取笔记详情
     * @param id 1
     * @return : java.lang.String
     * @author : ruozhuliufeng
     * @date : 2020/10/25 1:01
     */
    @GetMapping("/detail")
    public String detail(Integer id, HttpSession session){
        NoteOutputDTO note = noteService.findById(id);
        session.setAttribute("note",note);
        return "notes/note";
    }
    /**
     * 功能描述: 根据ID跳转到修改笔记页面
     * @param id 笔记ID
     * @param session 存储相关信息
     * @return : 修改页面路径
     * @author : ruozhuliufeng
     * @date : 2020/10/25 10:54
     */
    @GetMapping("/edit")
    @RequiresPermissions("note:update")
    public String edit(Integer id,HttpSession session){
        NoteOutputDTO noteEdit = noteService.findById(id);
        session.setAttribute("noteEdit",noteEdit);
        List<CategoryOutputDTO> categoryList = categoryService.findList();
        session.setAttribute("categoryList",categoryList);
        List<TagOutputDTO> tagList = tagService.tagList();
        session.setAttribute("tagList",tagList);
        return "notes/noteEdit";
    }

    /**
     * 功能描述: 修改笔记内容
     * @param noteInputDTO 要修改的笔记内容
     * @param session 获取相关信息
     * @return : 返回笔记列表
     * @author : ruozhuliufeng
     * @date : 2020/10/25 11:09
     */
    @PostMapping("/update")
    public String update(NoteInputDTO noteInputDTO,HttpSession session){
        // 改数据加写锁，防止多人同时编辑
        RReadWriteLock lock = redisson.getReadWriteLock("w-lock");
        // 获取写锁
        RLock rLock = lock.writeLock();
        try {
            // 改数据加锁
            rLock.lock();
            UserEntity user = (UserEntity) session.getAttribute("user");
            noteInputDTO.setUsername(user.getUsername());
            noteService.updateNote(noteInputDTO);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 释放锁
            rLock.unlock();
        }
        return "notes/note";
    }

    // TODO 定时任务：每天零点定时更新排名缓存信息
    /**
     * 功能描述:  获取排名信息
     * @param  session 存储相关信息
     * @return : 排名列表
     * @author : ruozhuliufeng
     * @date : 2020/10/29 21:58
     */
    @GetMapping("/rank")
    public String rank(HttpSession session){
        // 获取前五名查看量最高的笔记信息
        List<NoteOutputDTO> noteRankList = noteService.rank();
        session.setAttribute("noteRankList",noteRankList);
        return "index";
    }
    /**
     * 功能描述: 获取最新笔记
     * @param session 存储相关信息
     * @return : java.lang.String
     * @author : ruozhuliufeng
     * @date : 2020/10/29 23:26
     */
    @GetMapping("/newNote")
    public String getNewNote(HttpSession session){
        NoteOutputDTO newNote = noteService.newNote();
        session.setAttribute("newNote",newNote);
        return "index";
    }

}
